package Donnees;

import Metier.Objets.Perte;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

public class DaoPerte {
    
    private Connection connection;
    private Statement statement;
    private PreparedStatement preparedStatement;
    
    /**
     * Ajoute une perte en base de données avec ses paramètres
     * @param newP perte a ajouter
     * @throws SQLException 
     */
    public void ajouter(Perte newP) throws SQLException{
        try{
            //Récupération de la connexion
            connection = ConnectionFactory.getConnection();
            
            //Déclaration de la requête pour créer la perte
            String query = "INSERT INTO PERTE (PRODUIT_id, quantite, date)"
                    + " VALUES (?, ?, ?)";
            
            //Préparation de la requête
            preparedStatement = connection.prepareStatement(query);
            java.sql.Date dateSQL = new java.sql.Date(newP.getDate().getTime());
            preparedStatement.setInt(1, newP.getIdProduit());
            preparedStatement.setInt(2, newP.getQuantite());
            preparedStatement.setDate(3, dateSQL);
            
            //Exécution de la requête
            preparedStatement.executeUpdate();
            
        }
        finally{
            DbUtil.close(preparedStatement);
            DbUtil.close(connection);
        }
    }
    
    /**
     * Supprime toute la perte renseignée
     * @param perte la perte a supprimer
     * @throws SQLException 
     */
    public void supprimer(Perte perte) throws SQLException{
        try {
            String query;
            query = "DELETE FROM Perte where id = " + perte.getId();
            connection = ConnectionFactory.getConnection();
            statement = connection.createStatement();
            statement.execute(query);
        } finally {
            DbUtil.close(statement);
            DbUtil.close(connection);
        }
    }
    
    /**
     * Récupère les pertes qui ont eu lieu à une date donnée
     * @param d  date en question
     * @return la liste des pertes à la date spécifiée
     * @throws SQLException
     */
    public List<Perte> chercherPertesParDate(Date d) throws SQLException{
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String where = " WHERE date = '" + df.format(d) + "'";
        return chercherPerte(where);
    }
    
    /**
     * Récupère toutes les pertes
     * @return la liste des pertes
     * @throws SQLException
     */
    public List<Perte> chercherPertes() throws SQLException{
        return chercherPerte("");
    }
    
    /**
     * Récupère une perte à partir de son id
     * @param id id de la perte concernée
     * @return la perte demandée
     * @throws SQLException
     */
    public Perte chercherVenteParId(int id) throws SQLException{
        String where = " WHERE id = " + id;
        return chercherPerte(where).get(1);
    }
    
    /**
     * Méthode privée de recherche d'une perte à partir d'une clause where contruite dans l'une des fonctions de recherche publiques
     * @param whereClause la clause spécifique
     * @return la liste de pertes correspondantes à la clause
     * @throws SQLException 
     */
    public List<Perte> chercherPerte(String whereClause) throws SQLException{
        List<Perte> listePertes = new ArrayList<>();
        try {
            Perte p;
            ResultSet rs;
            String query = "SELECT * FROM PERTE " + whereClause;
            connection = ConnectionFactory.getConnection();
            statement = connection.createStatement();
            rs = statement.executeQuery(query);
            
            while (rs.next()) {
                Calendar cal = new GregorianCalendar();
                cal.setTime(rs.getDate("date"));
                
                p = new Perte(rs.getInt("id"), rs.getInt("quantite"), new DaoProduit().chercher(rs.getInt("PRODUIT_id")), cal.getTime());
                listePertes.add(p);
            }
        } finally {
            DbUtil.close(statement);
            DbUtil.close(connection);
        }
        return listePertes;
    }
    
    /**
     * Modifie la perte renseignée en base de données.
     * @param perte la perte a modifier
     * @throws SQLException 
     */
    public void modifier(Perte perte) throws SQLException{
        try{
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            
            //Récupération de la connexion
            connection = ConnectionFactory.getConnection();
            
            //Déclaration de la requête
            String query = "UPDATE VENTE SET date = '?', PRODUIT_id = ?, quantite = ? where id = ?";
            
            //Préparation de la requête
            preparedStatement = connection.prepareStatement(query);
            preparedStatement.setString(1, df.format(perte.getDate().getTime()));
            preparedStatement.setFloat(2, perte.getIdProduit());
            preparedStatement.setInt(3, perte.getQuantite());
            preparedStatement.setInt(4, perte.getId());
            
            //Exécution de la requête
            preparedStatement.executeUpdate();
            
            
        }
        finally{
            DbUtil.close(preparedStatement);
            DbUtil.close(connection);
        }
    }
    
}
